中文:正規表示式,又稱正則表達式,是電腦科學的一種概念,使用單個字串來描述、匹配一系列符合某個句法規則的字串。
在程式中常用來檢查使用者輸入的資料是否符合格式
Ex.
//電子信箱
let regexEM = "^([a-z0-9_\\.-])@([\\da-z\\.-]).([a-z\\.]{2,6})$"
//開頭為大寫字母,總長度在五到十碼以內的密碼
let regexPW = "^[A-Z][0-9A-Za-z]{4,9}$"
以下是範例程式:
四種不同的輸入格式,當我按下檢查時會執行檢查,不符格式的輸入匡,邊匡會變成紅色,修改正確就會變回來。
import UIKit
class ViewController: UIViewController {
// OutletCollection 將許多同類的元件放進同一個 Outlet 統一管理( 通常用在元件做的事情差不多的時候 )
@IBOutlet var textFields: [UITextField]!
override func viewDidLoad() {
super.viewDidLoad()
viewInit()
delegateAndDataSourseInit()
}
@IBAction func checkBtnClick(_ sender: UIButton) {
let regexEmail = "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+).([a-z\\.]{2,6})$"
let regexPhoneNumber = "^09[0-9]{8}$"
let regexID = "^[A-Z][1-2][0-9]{8}$"
let regexName = "^[A-Z][a-z]{2,8}$"
for i in 0...textFields.count - 1 {
switch i {
case 0:
compareAndChange(regex: regexEmail, textField: textFields[i])
case 1:
compareAndChange(regex: regexPhoneNumber, textField: textFields[i])
case 2:
compareAndChange(regex: regexID, textField: textFields[i])
default:
compareAndChange(regex: regexName, textField: textFields[i])
}
}
}
func viewInit() {
// 幫每個 TextField 加上 tag 以便區分
for i in 0...textFields.count - 1 {
textFields[i].tag = i
}
}
func delegateAndDataSourseInit() {
// forEach 會逛過陣列中所有的項目
textFields.forEach { (textField) in
// 委任
textField.delegate = self
}
}
// 檢查並改變外觀
func compareAndChange(regex: String, textField: UITextField) {
if compare(regex: regex, textField: textField) == 0 {
// 不符格式
changeBorderColor(textField: textField, Case: 0)
} else {
// 符合格式
changeBorderColor(textField: textField, Case: 1)
}
}
// 檢查格式
func compare(regex: String,textField: UITextField) -> Int{
// 根據格式的起始符號(^)及終止符號($)去檢查格式
let RE = try! NSRegularExpression(pattern: regex, options: .anchorsMatchLines)
// 符合格式為 1,否則為 0
let matchs = RE.matches(in: textField.text!, options: .reportProgress, range: NSRange(location: 0, length: textField.text!.count))
return matchs.count
}
// 改變 TextField 的外觀
func changeBorderColor(textField: UITextField, Case:Int) {
switch Case {
case 0:
textField.borderStyle = .roundedRect
textField.layer.borderWidth = 1.0
textField.layer.borderColor = UIColor.red.cgColor
textField.layer.shadowColor = UIColor.red.cgColor
default:
textField.layer.borderWidth = 0.0
textField.layer.shadowColor = UIColor.lightGray.cgColor
}
}
}
extension ViewController: UITextFieldDelegate {
// 按下 Enter 後自動跳行
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
let nextTag = textField.tag + 1
guard let nextTextField = textField.superview?.viewWithTag(nextTag) else {
// 如過是做後一個輸入匡則關閉鍵盤
textField.resignFirstResponder()
textField.endEditing(true)
return true
}
nextTextField.becomeFirstResponder()
return true
}
}
參考網站:
就是愛程式 -> https://atedev.wordpress.com/2007/11/23/正規表示式-regular-expression/
程式前沿 -> https://codertw.com/程式語言/681117/#outline__1_3